home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 3: CDPD 3
/
Almathera Ten on Ten - Disc 3: CDPD3.iso
/
ab20
/
unarced
/
utilities
/
shells
/
csh
/
run.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-03-17
|
6KB
|
274 lines
/*
* RUN.C
*
* (c)1986 Matthew Dillon 9 October 1986
*
* RUN handles running of external commands.
*
* Version 2.07M by Steve Drew 10-Sep-87
* Version 4.01A by Carlo Borreo & Cesare Dieni 17-Feb-90
* Version 5.00L by Urban Mueller 17-Feb-91
*
*/
#include "shell.h"
int MySyncRun( char *com, char *args, BPTR in, BPTR out, int nosync );
int echofunc(void);
int
do_run( char *str, int nosync )
{
int retcode;
char buf[200]; /* enough space for 100 char cmd name + path stuff */
char *path, *path2, *argline, *copy, *ext, *end;
if( !*av[0] )
return 0;
if( (retcode=echofunc())>=0 )
return retcode;
a0tospace( av[0] ); /* allow "com mand" */
argline=compile_av(av, 1, ac, ' ', 1);
if (strlen(av[0]) > 100) { ierror(NULL,509); return -1; }
if( ac==1 && isdir(av[0])) {
sprintf(buf,"cd \"%s\"",av[0]);
return execute( buf );
}
IoError=IoErr();
if( (IoError==218 || IoError==225 || IoError==226) && index(av[0],':')) {
ierror( av[0], IoError );
return 20;
}
sprintf(buf,"res_%s",BaseName(av[0])); /* delayed residents */
if (o_resident && Getenv(buf, buf+100, 90L)) {
Setenv(buf,NULL);
loadres(buf+100);
}
if( (retcode=MySyncRun(av[0],argline,0,0,nosync))>=0 ) /* AmigaDOS path */
goto done2;
if( retcode==PR_NOMEM ) {
ierror( av[0], 103 );
return 20;
}
IoError=IoErr();
if( (IoError==218 || IoError==225 || IoError==226) && index(av[0],':')) {
ierror( av[0], IoError );
return 20;
}
if (path = dofind(av[0],"",buf+80,v_path)) { /* shell path */
DPTR *dp;
BPTR fh;
int stat, script;
if((retcode = MySyncRun(path,argline,0,0,nosync))>=0)
goto done2;
if(dp=dopen(path,&stat)) {
script= dp->fib->fib_Protection&FIBF_SCRIPT;
dclose(dp);
if( !stat && script ) {
char *t;
buf[0]=0;
if( fh=Open(path,MODE_OLDFILE )) {
Read(fh,buf,79);
Close(fh);
if(t=index(buf,'\n')) *t=0;
}
if( buf[0]=='/' && buf[1]=='*' ) {
sprintf(buf, "Rx %s", str );
} else if( (buf[0]!=';' || buf[0]!='#') && buf[1]=='!' ) {
memmove(buf,buf+2,strlen(buf+2)+1);
strcat( buf," ");
strcat( buf,str);
} else {
sprintf(buf,"Execute %s", str );
}
return execute( a0tospace(buf));
}
}
}
if(!(end=rindex(av[0],'.'))) end=""; /* automatic sourcing */
ext=strcmp(end,".sh") ? ".sh" : "";
if (path = dofind(av[0],ext,buf,v_path)) {
av[1] = buf;
copy = salloc(strlen(str)+3);
sprintf(copy,"x %s",str);
retcode = do_source(copy);
goto done;
}
copy=salloc(strlen(av[0])+strlen(argline)+5);
sprintf(copy,"%s %s",av[0],argline);
ext=strcmp(end,".rexx") ? ".rexx" : ""; /* automatic rx-ing */
if( path = dofind(av[0], ext, buf, v_rxpath )) {
strcat (path," ");
if( strlen(argline)>140 ) argline[140]=0;
strcat (path,argline);
/* strncpy(path+strlen(path),argline,190); */
if( (retcode=MySyncRun("rx",path,0,0,0)) >=0 ) goto done;
if (path2 = dofind("rx","",buf+160,v_path)) {
retcode = MySyncRun(path2,path,0,0,0);
goto done;
}
}
if( !doaction(av[0],"exec",argline)) {
retcode=0;
goto done;
}
retcode=-1;
fprintf(stderr,"Command not found %s\n",av[0]);
done:
free( copy );
done2:
setioerror( IoErr() );
free( argline );
return retcode;
}
struct Segment {
BPTR NextEntry;
LONG UseCount;
BPTR SegPtr;
BSTR SegName;
};
int
MySyncRun( char *com, char *args, BPTR in, BPTR out, int nosync )
{
struct Segment *seg;
int ret, len=strlen(args);
char buf2[200], *buf=buf2;
long oldname;
#ifdef KICK20
if( o_kick20 ) {
oldname = (long)Mycli->cli_CommandName;
args[len]='\n'; args[len+1]=0;
while( (long)buf & 3 ) buf++;
buf[0] = strlen( com );
strncpy(buf+1,com,80);
Forbid();
if(seg=FindSegment( (UBYTE *)com, NULL, 0 ))
seg->UseCount++;
Permit();
if( seg ) {
Mycli->cli_CommandName = (long)buf/4;
ret=RunCommand(seg->SegPtr, Mycli->cli_DefaultStack,
(UBYTE *)args, strlen(args));
seg->UseCount--;
Mycli->cli_CommandName = (long)oldname;
return ret;
}
if( o_internal ) {
Forbid();
seg=FindSegment( (UBYTE *)com, NULL, 1 );
Permit();
if( seg && seg->UseCount==-2 ) {
Mycli->cli_CommandName = (long)buf/4;
ret=RunCommand(seg->SegPtr, Mycli->cli_DefaultStack,
(UBYTE *)args, strlen(args));
Mycli->cli_CommandName = (long)oldname;
return ret;
}
}
args[len]=0;
}
#endif
if( nosync ) {
sprintf(buf2,"%s %s",com,args);
Execute(buf2,0,Myprocess->pr_COS);
return 0;
}
if( (ret= SyncRun( com, args, in, out ))>=0 )
return ret;
if( ret==PR_NOMEM ) {
ierror(NULL,103);
return 20;
}
return -1;
}
#if 0
int
do_which( char *str )
{
char *got, *com=av[1];
if( get_var(LEVEL_ALIAS,com) ) {
printf("Shell Alias '%s'\n",com);
return 0;
}
if( *(got=find_internal( com ))>1 ) {
printf("Shell Internal '%s'\n",got);
return 0;
}
printf( "Not found\n" );
return 20;
}
#endif
char *
dofind( char *cmd, char *ext, char *buf, char *path)
{
char *ptr, *s=path, *ret=NULL;
Myprocess->pr_WindowPtr = (APTR)(-1);
sprintf(buf,"%s%s",cmd,ext);
if (exists(buf)) {
ret=buf;
goto terminate;
}
if ((char*)BaseName(buf)==buf) {
if( *path=='_' )
s = get_var(LEVEL_SET, path);
while (*s) {
for (ptr=buf; *s && *s!=','; ) *ptr++ = *s++;
if( ptr[-1]!=':' && ptr[-1]!='/')
*ptr++='/';
sprintf(ptr, "%s%s", cmd, ext);
if (exists(buf)) {
ret=buf;
goto terminate;
}
if (*s) s++;
}
}
terminate:
Myprocess->pr_WindowPtr = (APTR)o_noreq;
return ret;
}